package cn.hinglo.gameclaw.admin.service;

import cn.hinglo.gameclaw.admin.dao.BannerDao;
import cn.hinglo.gameclaw.data.entity.Result;
import cn.hinglo.gameclaw.data.utils.FileImageUtils;
import cn.hinglo.gameclaw.data.utils.IdUtils;
import cn.hinglo.gameclaw.data.utils.ResultUtils;
import cn.hinglo.gameclaw.user.bean.Banner;
import cn.hutool.core.util.StrUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

import static cn.hinglo.gameclaw.data.utils.CheckDataUtils.checkIdResultUtils;
import static cn.hinglo.gameclaw.data.utils.FieldUtils.*;


/**
 * @createTime: 2017/12/29
 * @author: HingLo
 * @description: Banner图管理的服务层
 */
@Service
public class BannerService {

    private final BannerDao bannerDao;

    @Autowired
    public BannerService(BannerDao bannerDao) {
        this.bannerDao = bannerDao;
    }

    /**
     * @return Banner图集合
     */
    public List<?> listBannerService() {
        //用于设置banner图的类，将数字转化为可见字符
        return bannerDao.selectAll();
    }

    /**
     * 添加banner
     *
     * @param banner Banner图对象
     * @param header banner图对象
     * @return 添加结果
     */
    public boolean addBannerService(Banner banner, MultipartFile header) {

        Integer type = banner.getType();
        String tid = banner.getTid();
        //检测Tid是否在数据库中
        boolean bool;
        switch (type) {
            //h5
            case HTML:
                bool = tid.equals(bannerDao.findByIdHtmlDao(tid));
                break;
            //娃娃机
            case CLAW:
                bool = tid.equals(bannerDao.findByIdClawDao(tid));
                break;
            //公告
            case NOTICE:
                bool = tid.equals(bannerDao.findByIdClawDao(tid));
                break;
            //充值
            case RECHARGE:
                bool = true;
                break;
            default:
                return false;
        }
        //依赖的ID正确
        if (bool) {
            String fileName = FileImageUtils.createFileNameUtils(header);
            //设置Id
            banner.setId(IdUtils.getId());
            banner.setType(type);
            //设置图片名称
            banner.setImageUrl(fileName);
            //设置使用状态
            banner.setStatus(false);
            if (FileImageUtils.saveImageUtils(header, fileName, IMAGE_1)) {
                if (bannerDao.insert(banner) > 0) {
                    return true;
                } else {
                    //插入是失败后，就删除上传好的文件
                    FileImageUtils.deleteImageUtils(fileName, IMAGE_1);
                }
            }
        }
        return false;
    }

    /**
     * 删除banner图的id
     *
     * @param id banner图的唯一Id
     * @return 删除结果
     */
    public Result deleteBannerService(String id) {

        //删除之前要查询该ID的图片名称
        checkIdResultUtils(id);
        //查询该bannerId的图片名称
        String fileName = bannerDao.findByIdImageName(id);

        //实体条件
        Banner banner = new Banner();
        banner.setId(id);
        banner.setStatus(false);


        boolean bool = StrUtil.isNotBlank(fileName) && bannerDao.delete(banner) > 0;
        //数据库删除成功，就删除文件中的数据
        if (bool) {
            FileImageUtils.deleteImageUtils(fileName, IMAGE_1);
        }
        return bool ? ResultUtils.success() : ResultUtils.error("删除失败");
    }

    /**
     * 修改banner图的使用状态
     * <p> 修改Banner状态后，就删除系统中的缓存，让客服端即时生效</p>
     *
     * @param id     banner的唯一Id
     * @param status 修改的住状态
     * @return 返回结果
     */
    @CacheEvict(cacheNames = "banner")
    public Result changeBannerService(String id, boolean status) {
        //检测Id格式是否符合要求
        checkIdResultUtils(id);
        return bannerDao.changeBannerDao(id, status, !status) > 0 ? ResultUtils.success() : ResultUtils.error("修改失败");

    }


}
